package com.vivo.challenge;

import java.util.HashMap;

/**
 * Signup MyJavaServer provides a development environment for Java web
 * applications.
 * 
 * An open environment like MJS is a target of malicious users who abuse our
 * services for illegal or simply inappropriate activities. In order to minimize
 * abuse and yet provide our services to all interested Java developers for
 * free, we require you to demonstrate your Java skills. The challenge is easy
 * to master but does require some knowledge of the Java programming language.
 * 
 * Signup Challenge Master a simple Java programming challenge (STATUS: NOT
 * PASSED)
 * 
 * As the principal engineer of an HTTP web server, you are responsible for
 * implementing the request processing subsystem of the server. An incoming
 * request for a specific resource, identified by an URI, must be dispatched to
 * the appropriate handler according to the server configuration which maps URIs
 * to request handlers. 'HandlerFactory.getHandler' must be implemented:
 * 
 * public class HandlerFactory { public String getHandler(String[] config,
 * String requestUri) { } }
 * 
 * The string array 'config' contains URI patterns and handler names. Two
 * consecutive values form a key-value pair comprised of URI pattern and
 * handler. 'requestUri' represents an incoming request, the URI to match
 * against the configured handlers. 'getHandler' must return the correct handler
 * for a given URI as a string value.
 * 
 * An URI pattern never contains wildcards and represents the start of an URI
 * string, a prefix. Matching must be implemented accordingly. The handler with
 * the longest matching URI pattern wins if more than one pattern matches. If no
 * handler can be found, "8Gq9Le1" must be returned.
 * 
 * Example input:
 * 
 * String[] config: { "/", "MainServlet", "/nav", "NavigationServlet" } String
 * requestUri: "/nav/test"
 * 
 * Correct result: "NavigationServlet"
 * 
 * In this example, the configuration contains a mapping of "/" to "MainServlet"
 * and "/nav" to "NavigationServlet". In the case of an incoming URI
 * "/nav/test.nav", "NavigationServlet" is the correct choice because its
 * pattern is longer than that of "MainServlet".
 * 
 * @author elivoa
 * 
 */
public class MyJavaServerChallenge {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String[] config = { "/", "TestServlet", "/test", "TestServlet2" };
		String requestUri = "/test/Test";
		MyJavaServerChallenge m = new MyJavaServerChallenge();
		System.out.println(m.getHandler(config, requestUri));
	}

	public String getHandler(String[] config, String requestUri) {

		HashMap<String, String> map = new HashMap<String, String>();

		for (int i = 0; i < config.length - 1; i = i + 2) {
			map.put(config[i], config[i + 1]);
		}

		String result = "";
		String temp = "";
		int maxlength = 0;
		String maxMatchString = "";
		String middlematch = "";

		int charpos = 0;
		while (requestUri.length() > charpos) {
			temp = requestUri.substring(0, charpos + 1);

			middlematch = map.get(temp);
			if (middlematch == null || middlematch.equals("")) {
				charpos++;
				continue;
			}

			if (maxlength < charpos + 1) {
				maxlength = charpos + 1;
				maxMatchString = temp;
			}
			charpos++;
		}
		result = map.get(maxMatchString);

		if (result == null || result.length() == 0) result = "8Gq9Le1";
		return result;

	}
}
